import pandas as pd
import datetime
#condition-->(start_time,end_time,code)
#计算每天相对7天前的涨跌幅度
def run(dbutil,condition):
    #与7天前做对比
    Date_QUERY = -7
    code = condition[2]
    condition = list(condition)
    #时间类型
    start_time =   datetime.datetime.strptime(condition[0],'%Y-%m-%d')
    #修改制作的条件，把开始时间往前移7天，字符类型
    condition[0] = (start_time+datetime.timedelta(days=Date_QUERY)).strftime('%Y-%m-%d')
    condition = tuple(condition)

    # 获取时间段内所有的净值数据
    read_sql = "select net_values,week,date,convert_drifts from foundation_values " \
               "where date >= %s and date<=%s and  code = %s and  net_values !=''"
    results=[]
    df = pd.read_sql(read_sql, con=dbutil.conn,params=condition)
    df['index_date'] = pd.to_datetime(df['date'])  # 新增一个索引列,将数据类型转换为日期类型
    df = df.set_index('index_date')  # 将date设置为index

    for current_date in df.index:
        if current_date<start_time:
            continue
        result=[]
        #时间类型
        s_time = (current_date + datetime.timedelta(days=Date_QUERY))
        #字符类型,帅选的条件区间
        min_date = s_time.strftime('%Y-%m-%d')
        max_date = current_date.strftime('%Y-%m-%d')

        # 按行的索引按降序进行排序,日期由大到小,根据索引获取时间点内的数据
        temp = df[min_date:max_date].sort_index(ascending=False)
        # [0-net_values,1-week,2-date,3-convert_drifts]
        maxday_value = float(temp.iloc[0][0]) #日期最大那天的净值
        minday_value = float(temp.iloc[-1][0]) #日期最小那天的净值
        maxday_week = int(temp.iloc[0][1])#日期最大那天的周
        min_day = temp.iloc[-1][2] #日期最小的那天

        all_days = 0 #区间内有数据的天数
        for label in temp.index:
            all_days+=1
            date = temp.loc[label].values[2]#日期
            convert_drifts = temp.loc[label].values[3]#是否分红,若为空则表示不分红
            if date != min_day:
                if convert_drifts.startswith('每份派现金'):
                    maxday_value += float(convert_drifts[5:-1])
                elif convert_drifts.startswith('每份基金份额折算'):
                    maxday_value *= float(convert_drifts[8:-1])
        change_rate = round((maxday_value - minday_value) / minday_value * 100, 2)
        result.append(code)
        result.append(max_date)
        result.append(maxday_week)
        result.append(change_rate)
        result.append(all_days)
        results.append(tuple(result))
    return results